/***********************************************************************
 * Module:  Pipe.java
 * Author:  Jean-Fran�ois FERNANDES, Alex Rameaux WAFO DEFO
 * Purpose: Defines the Class Pipe
 ***********************************************************************/
package event;
import java.util.ArrayList;


public class Pipe <P extends Event> {

	/** Liste des �v�nements dans une file. */
	private ArrayList<P> events;
	
	/** Le sommet courant de la file. */
	private int sommet; 

	/** Le constructeur. */
	public Pipe() {
		events = new ArrayList<P>();
		sommet = -1;
		new Reader().start();
	}
	

	/**
	  * Rajoute un �v�nement dans la file de type correspondante.
	  * @param event L'�v�nement � ajouter dans la file.
	  */
	 public void push(P event){
		 events.add(0, event);
		 sommet++;
	 }
	 
	 /*/**
	  * Retourne l'�v�nement qui se trouve � la t�te de la file.
	  * 
	  * @return l'event � la t�te de la file.
	  
	 public P pop(){
		  if(events.isEmpty()){
			  return null;
		  }else{
			  P tmp = read();
			  remove(events.get(sommet + 1));
			  return tmp;
		  }
	 }*/
	 
	 /**
	  * Retourne l'�v�nement qui se situe � la t�te de la file.
	  * L'�l�ment reste dans la file mais le sommet de la file est d�cal�.
	  * 
	  * @return L'�v�nement � la t�te de la file.
	  */
	 public P read(){
		  if(events.isEmpty()){
			  return null;
		  }else{
			  return events.get(sommet--);
		  }
	 }
	 
	 
	 /**
	  * Retire un �v�nement de la file.
	  * La valeur du sommet devra �tre recalculer en fonction de la position de l'�v�nement r�tir�.
	  * 
	  * @param event L'�v�nement � retirer de la file.
	  */
	 public void remove(P event){
		 if(events.contains(event)){
			 int index = events.indexOf(event);
			 events.remove(event);
			   
			 if(index <= sommet){
			    sommet--;
			 }
		 }
	 }
	 

	 /**
	  * Recherche et retire les �v�nements dont la dur�e de vie � expir�e (fonction "isOutOfTime"). 
	  */
	 public void scan(){
		 if (events.size() > 0) {
			 ArrayList<P> list = new ArrayList<P>(events);
			 for(P event : list){
				 if(event.isOutOfTime()){
					 remove(event);
				 }
				 
				 for (int i = sommet + 1; i < events.size(); i++){
					 events.remove(i);
				 }
			 }
		 }
	 }
	 
	 /**
	  * Vide la file. 
	  */
	 public void removeAll(){
		 events.clear();
		 sommet = -1;
	 }
	 
	 /**
	  * R�cup�re la liste d'�v�nements correspondant.
	  * @return La liste d'�v�nements correspondant.
	  */
	 public ArrayList<P> getEvents() {
		 return events;
	 }

	 /**
	  * R�cup�re le sommet de la file.
	  * @return Le sommet de la file.
	  */
	 public int getSommet() {
		return sommet;
	 }
	
	 /**
	  * Purge une file lorsque la dur�e de vie d'un �v�nement arrive � expiration.
	  * @author Jean-Fran�ois FERNANDES, Alex Rameaux WAFO DEFO
	  *
	 */
	 public class Reader extends Thread {
		 public synchronized void run() {
			 while(true) {
				 try {
					 Thread.sleep(1000);
					 scan();
					 if (events.size() > 0)
						 System.out.println("Scan de la file " + events.get(0).getClass().toString().split(" ")[1] + " termin�.");
					 else
						 System.out.println("Files vides");
					 System.out.println();
				 } catch (InterruptedException e) {
					 e.printStackTrace();
				 }
			 }
		 }
	 }
	 
	 
}
